(function () {
    // 优化面向过程版
    function extend(obj, target) {  // extend实现继承,实际上是把每个属性拷贝过来
        for (var i in obj) {
            target[i] = obj[i];
        }
    }

    var doms = [],
        push = doms.push;

    function init(selector) {
        //选择器用原生代替，复杂的自行实现
        push.apply(this, document.querySelectorAll(selector));  //改变this，把dom添加到new出的对象上
        this.selector = selector;  //添加选择器备份
    }

    init.prototype = $.prototype;

    function $(selector) {
        if (selector) {
            return new init(selector);
        }
    }

    $.fn = function (name, fn) {
        $.prototype[name] = function () {
            this.each(fn, arguments); //$.fn 在原型上添加方法  默认返回this以实现链式编程
            return this;
        }
    };
    $.extend = function (obj) {
        extend(obj, $.prototype);   // $.extend实现继承 可自定义返回值，若返回this，可实现链式编程；
    };
    $.extend({
        css: function (name, value) {
            this.each(function () {
                if (!value) {//如果value不存在，name是一个对象，则遍历添加样式
                    for (var i in name) {
                        this.style[i] = name[i]
                    }
                    return;
                }
                this.style[name] = value;  //如果value存在，name是样式名
            });
            return this;
        },
        each: function (fn, argument) {
            if (fn)for (var t = 0, l = this.length; t < l; t++) {
                fn.apply(this[t], argument);
            }
            //forEach 遍历数组
            //if (fn)this.forEach(function (value) {
            //    fn.apply(value, argument); //argument是传过来的数组arguments，apply会将数组分割成每一个参数传给fn
            //})
        }
    });
    window.$ = $;
}());
